Introduction

La reconnaissance automatique de la musique est une partie essentielle des logiciels de traitment de musique.

Les résultats d’une reconnaissance automatique sont utilisable dans des applications nombreuses. Beaucoup d’efforts sont

Nous nous sommes intéressés par la transcription de la musique. Ainsi, nous avons choisi de travailler sur ce sujet dans le cadre du projet semestriel. Pendant le développement de ce projet, nous avons dû apprendre les bases du traitement de signaux sonores et par la suite étudier les recherches effectuées sur les méthodes de reconnaissance.

Dans ce rapport, nous présentons une analyse de signaux sonores et une méthode simple de reconnaissance de musique monophones.

Signaux sonores

Son harmonique

Le son d’un résonateur acoustique comme une chorde ou une colonne d’air est une onde stationnaire. On dit que tel son évoque un pitch défini. Dans le cas des instrument de percussion, le son présente une inharmonicité. On dit que tel son évoque un pitch indéfini. Dans ce projet on ne s’intéressera qu’au sons harmoniques de pitch défini.

Un signal sonore de pitch défini, est une série harmonique de sons purs, représenté par des ondes sinusoïdales dont les fréquences sont des multiples entiers d’une fréquence dîte la fondamentale (où le pitch) notée \(f_0\).

\[ x(t) = \sum\limits_{k\in\mathbb{N}} A_k\cdot\cos(2\pi k f_0 t) \]\(A_k\) est l’amplitude de la kème harmonique.

On cherche donc à indentifier f_0 dans un signal harmonique donnée.

La transformée de Fourier et ses variantes

La transformée de Fourier permet d’identifier la fréquence d’une fonction périodique. \[\hat{x}(f) = \int\limits_{-\infty}^{\infty} x(t)\cdot e^{-2\pi j ft}\mathrm{d}t\] Le pic de \(\hat{x}(f)\) correspond à la fréquence du signal \(x(t)\). Comme la transformée de Fourier est linéaire, la transformée d’un signal harmonique produit plusieurs pics.

Linéarité de la transformée de Fourier

Linéarité de la transformée de Fourier

La transformée de Fourier à court terme

Grâce à la transformée de Fourier et sa linéarité on peut obtenir les fréquences d’un signal harmonique. Or, en pratique, un signal sonore change souvent de fréquences, on voudrait donc obtenir la transformée de Fourier en fonction du temps et de la fréquence, la transformée de Fourier à court terme (anglais: Short-Time Fourier Transform) souvent dîte STFT permet d’obtenir tel fonction.

La STFT se calcule à l’aide d’une fonction de fenêtrage \(w\), qui est une fonction à support compact. En effet, la STFT est la transformée de Fourier d’une fonction pondérée avec une fenêtre \(w\) de support compact suffisamment petit. Le principe de cette transformée est analogue au produit de convolution.

\[X(t, f) = \int\limits_{-\infty}^{\infty} x(\tau)\cdot w(\tau-t)\cdot e^{-2\pi j f\tau} \mathrm{d}\tau \]

La transformée de Fourier discrète

Dans ce projet, on voudrais analyser un son enregistré, on étudie donc le signal sur un intervalle fermé en temps discret.

Soit \(N\) le nombre d’échantillons pris sur l’intervalle \([0,t_{\text{max}}[\). On introduit la fréquence d’échantillonnage \(f_s\) dîte en anglais sample rate ou sampling frequency. On a donc \(t_n = \frac{n}{f_s}\) pour \(n\in\{0,1,\dots,N-1\}\).

\[\begin{align} \hat{x}(f) &= \int\limits_{0}^{t_{\text{max}}} x(t)\cdot e^{-2\pi j ft}\mathrm{d}t \\ &= \lim\limits{f_s\rightarrow\infty} \sum\limits_{n=0}^{N-1} x(t_n)\cdot e^{-2\pi j ft_n}\\ &= \lim\limits{f_s\rightarrow\infty} \sum\limits_{n=0}^{N-1} x(t_n)\cdot e^{-2\pi j f \frac{n}{f_s}} \end{align}\]

On note \(x[n] = x(t_n)\) on a donc \[ \hat{x}(f) = \sum\limits_{n=0}^{N-1} x[n]\cdot e^{-2\pi j f \frac{n}{f_s}}\]

On peut également discrétiser la fréquence en définissant \(X[k]=\hat{x}(f)\). \[ X[k] = \sum\limits_{n=0}^{N-1} x[n]\cdot e^{-2\pi j k \frac{n}{f_s}}\]

De même, STFT se discrétise: \[X[n, k] = \sum\limits_{n=0}^{N-1} x[m]\cdot w[m-n]\cdot e^{-2\pi j k \frac{m}{f_s}}\]

Cette partie est une sur-simplification du théroème d’échantillonnage de Nyquist-Shannon.

Fenêtrage

Il existe une infinité de fenêtres à utiliser dans les calculs. La plus simple est la fonction rectangulaire, mais nous avons utilisé dans l’intégralité du projet la fonction Hann.

Le choix de la fonction est basé sur un le phénomène du aliasing qui rend les signaux indisntinguables lors de l’échantillonnage. En effet, la fenêtre Hann cause peu de aliasing d’où notre choix.

\[w[n] = \sin^2\left(\frac{\pi n}{N -1}\right) =\frac{1}{2}\left(1-\cos\left(\frac{2\pi n}{N -1}\right)\right)\] La fenêtre Hann est sa transformée de Fourier

Pitch

Ils existent plusieurs algorithmes de détection de fréqences fondamentales, il y’en a deux types : applications sur le domaine temporel et sur le domaine fréquenciel. Les applications sur le domaine fréquenciel calculent les fréquences à partir de la transformée de Fourier du signal, où les méthodes du domaine temporel les calcules à partir du signal sans passer par la transformée de Fourier.

Chaque type présente des avantages et des inconvénients. Nous avons décidé d’implémenter une de chaque type:

YIN

L’algorithme de YIN (Kawahara et de Cheveigné, 2002) est une méthode robuste pour la reconnaissance du pitch, il s’agit d’un modèle temporel. Son principe est la séléction de fréquences candidats parmi toutes les fréquences détéctés sur l’intervalle de fenêtrage.

La méthode propose que l’expression \(x(t)-x(t+\tau)\) atteint son minimum quand \(\tau\) est égale à la période du signal (i.e. \(\frac{1}{f_0}\)). En diffinissant la fonction de différence à l’instant \(t\) fixé: \[ d_t(\tau) = \int\limits_{t}^{t+T_w} \left(x(t)-x(t+\tau)\right)^2 \mathrm{d}t \]\(T_w\) est la taille de la fenêtre \(w\), on appelle \(\tau\) le retard (anglais: lag).

Soit en temps discret: \[ d_n[m] = \sum\limits_{i=n+1}^{n+N_w} \left(x[n]-x[n+m]\right)^2 \]

Par la suite, on calcule la fonction de la moyenne cumulative définie par: \[d_t'(\tau) = \begin{cases} 1 &\text{si} \tau = 0\\ d_t(\tau) / \frac{1}{\tau}\int\limits_{0}^{\tau}d_t(u)\mathrm{d}u &\text{sinon} \end{cases}\] Soit en temps discret: \[d_n'[m] = \begin{cases} 1 &\text{si} m = 0\\ d_n[m] / \frac{1}{m}\sum\limits_{i=0}^{m}d_t[i] &\text{sinon} \end{cases}\]

Les candidats sont les minimums locaux de \(d_n'\).

YIN spectrale

L’algorithme de YIN spectrale (Paul Brossier, 2006) est une méthode qui utilise la même logique de l’algorithme de YIN et l’applique sur la STFT.

La fonction de différence est définie par: \[ \hat{d}_n[m] = \frac{2}{N} \sum\limits_{k=0}^{\frac{N}{2}+1} \left\lvert\left( 1-e^{2\pi jkm/N} \right) X[n,k] \right\rvert^2 \]

La fonction de la moyenne cumulative se calcule de façon analogue à l’algorithme de YIN. L’algorithme cherche le minimum globale de cette dernière.

Segmentation temporelle

L’étape fondamentale dans la reconnaissance du son est la segmentation temporelle. Il s’agit de trouver les frontières des objets sonores, c’est-à-dire:

  • Le début de la note – dît onset.
  • La fin de la note – dît offset.

Attack, transient, decay, onset
IEEE TRANSACTIONS ON SPEECH AND AUDIO PROCESSING, VOL. 13, NO. 5, SEPTEMBER 2005

Cette étape dépend fortement sur le type du son produit; les instrument à chordes pincées (guitare, piano, oud, etc.) ont un profile différent de celui des instruments à cordes frottées (la famille du violon) ou de celle des instruments à vent.

Dans cette partie on expliquera les méthodes implémentés pour la reconnaissance du onset.

Méthode

La lecture scientifique indique une méthode rigoureuse qu’on a simplifier pour obtenir des résultats rapide.

Il s’agit de définir une fonction qui permet de quantifier la perturbation du signal à un moment donné, cette fonction est souvent appellée Onset Detection Function ou Onset Strength Signal, dans ce projet on fera référence à cette dernière par Onset Detection Function ou ODF.

Théoriquement, les maximums locaux de l’ODF sont les onsets du signal, mais en pratique il s’agit d’un sous-ensemble de ces points. En effet, l’ODF est souvent très sensible et détectera la moindre des perturbations.

Ce problème pourra être résolu en définissant un seuil au dessous duquel aucun onset est considéré. Ils existent plusieurs méthodes pour définir tel seuil.

Soit un seuil fixe, ce qui minimise le coût des calculs au prix de la qualité des résultats. Soit de calculer un seuil variable, il s’agit de lisser la fonction ODF par des méthodes classiques comme la moyenne mobile.

La méthode consiste donc en trois étapes: 1. Calcul de l’Onset Detection Function. 2. Thresholding: calcul du seuil. 3. Peak-picking: la selection des onsets.

Onset Detection Function (ODF)

Ils existent plusieurs fonction de détéction d’onsets, on expliquera quelques unes qui se basent sur la STFT.

High Frequency Content (HFC)

Il s’agit de priviligier les fréquences élevées dans un signal: \[ HFC[n] = \sum\limits_{k=1}^{N}k\cdot\left\lvert X[n,k]\right\rvert^2 \]

Phase Deviation (Phi)

Il s’agit de calculer les différences de phases en dérivant l’argument complex de la STFT, on note $(t, f) = (X(t, f)) $. \[\hat{\varphi}(t, f) = \mathrm{princarg} \left( \frac{\partial^2 \varphi}{\partial t^2}(t, f) \right) \]\[ \mathrm{princarg}(\theta) = \pi + ((\theta + \pi) mod (-2\pi)) \] donc la ODS de phase se calcule par la formule: \[ \Phi[n] = \sum\limits_{k=0}^{N}\left\lvert \hat{\varphi}[n, k] \right\rvert \]

Dans notre implémentation, nous avons approximé la dérivée partielle seconde de la phase par un schéma de Taylor d’ordre 2.

Complex Distance

Cette méthode permet de qualifier les changements spectraux du signal ainsi que les changements en phase. Il s’agit de calculer une prédiction du spectre du signal, et puis le comparer par sa valeur. On reprend la fonction calculée en \(\hat{varphi}(t, f)\) de la méthode précédante. On définit la prédiction : \[ \hat{X}[n, k] = \left\lvert X[n, k] \right\rvert \cdot e^{j\hat{\varphi}[n, k]} \]

Donc la distance complexe se calcule: \[ DC[n] = \sum\limits_{k=0}^{N} \left\lvert \hat{X}[n, k] - X[n, k] \right\rvert ^2 \]

Thresholding

Nous avons décidé de lisser la fonction ODF par une moyenne mobile echelonnées par la fenêtre Hann, il s’agit du produit de convolution de l’ODF avec la fonction Hann.

Théorie de musique

Introduction du problème

L’espace de notes est un espace linéaire discrèt, mais l’espace de fréquences est continue non-linéaire. Le problème consiste à trouver une fonction qui associe les fréquences fondamentales obtenues avec des valeurs entières.

Gammes et intervalles

En acoustique, un intervalle désigne le rapport de fréquences de deux sons. Or, chaque intervalle est caractéristique d’une échelle musicale, elle-même varie selon le type de musique.

En musique, une gamme (en: scale) est une suite de notes conjointes où la fréquence de la dernière est le double de celle de la première. Une gamme se caractérise par sa première note et la suite d’intervalles qui séparent les notes conjointes.

L’armure — ou l’armature (en: key signature) — est un ensemble d’altérations réunies à la clé. Elle est composée soit exclusivement de dièses, soit exclusivement de bémols — en dehors du cas particulier constitué par le changement d’armure. Ces altérations correspondent à la tonalité principale des mesures suivant la clé.

À chaque tonalité majeure est associée une tonalité en mode mineur, présentant la même armure de clef et appelée relative mineure.

Le cycle des quintes

Le cycle des quintes

Pour simplifier, on va considérer la théorie de la musique occidentale basée sur l’accord tempéré (depuis le XVIIIe siècle). Dans ce cas, l’intervalle séparant la première et la dernière note d’une gamme est dite octave, une octave se divise en 12 écarts égales appelés demi-tons. La dernière note porte le même nom de la première dans la gamme.

Les intervalles sur un piano

Les intervalles sur un piano

Nomenclature

Ils existent plusieurs systèmes de nomenclature de notes de musique. Le système utilisé en France adopte les noms en termes de Do-Ré-Mi-Fa-Sol-La-Si. De plus, il existe un système basé sur l’alphabet latin : C-D-E-F-G-A-B. Les deux systèmes sont très utilisés, dans ce projet on utilisera le dernière pour simplifier.

Vu que les noms des notes se répètent au bout d’un octave, il faut distinguer une note LA de fréquence \(440Hz\) d’une autre de fréquence \(220Hz\) ou \(880Hz\).

Le système de notation scientifique Scientific Pitch Notation identifie une note par sont nom alphabetique avec un nombre identifiant l’octave dans laquelle elle se situe, où l’octave commence par une note C. Par exemple la fréquence \(440Hz\) représente \(A_4\) sans ambiguité, et les fréquences \(220Hz\) et \(880Hz\) représentent les notes \(A_3, A_5\) respectivement.

Dans le protocole MIDI, le notes sont représentées par un nombre entier, il permet de coder plus de 10 octave en partant de la note \(C_{-1}\).

La notation scientifique sur un piano

La notation scientifique sur un piano

Reconnaissance des notes

Un demi-ton est l’écart entre deux touches voisines sur un piano. On voudrais savoir le rapport \(r\) de fréquences associé à un demi-ton, sachant que l’octave double la fréquence on peut conclure facilement : \[ r^{12} = 2 \Rightarrow r=2^{1/12} \]

On souhaite ramener l’espace de fréquences \((\mathbb{R},\times)\) à l’espace \((\mathbb{N},+)\) tel que \(\boxed{\text{demi-ton}\equiv 1}\). On définit donc une bijection \[\forall f\in]0,\infty[, f\mapsto 12 \log_2 f \] En arrondissant le résultat à la valeur entière la plus proche, on obtient un espace linéaire discrèt correspondant aux notes.

Il sera convenient d’obtenir les mêmes notes du protocole MIDI vu qu’il est très bien établi et très utilisé. Pour cela, on effectue une petite translation, en partant de la note de référence \(A4\equiv 69_{\text{MIDI}} \equiv 440Hz\).

\[\begin{cases} \varphi:f\mapsto 12\log_2 f + c_{\text{ref}}\\ \varphi(440) = 69 \end{cases}\Rightarrow c_{\text{ref}} = 69 - 12\log_2 440\] Par conséquent, la bijection \(\varphi\) est définit par : \[\varphi: ]0,\infty[ \rightarrow \mathbb{R} : f \mapsto 12\log_2 f + c_{\text{ref}} \quad\text{avec } c_{\text{ref}}=69 - 12\log_2 440\] On note \(\bar{\varphi}\) la fonction définit par \(\bar{\varphi}(f)=\left\lfloor\varphi(f)\right\rceil\in\mathbb{Z}\)\(\lfloor\cdot\rceil\) est la fonction d’arrondissement à l’entier le plus proche.

On peut donc obtenir les nombres MIDI de notes à partir des fréquences fondamentales grâce à la fonction \(\bar{\varphi}\).

Néanmoins, le nombre MIDI n’est pas suffisant pour identifier une note, car certaines notes ont la même fréquence en accord tempéré et donc le même nombre midi (i.e. la même touche sur un piano), par exemple \(\text{MIDI}(C\#)=\text{MIDI}(D\flat)\). Pour distinguer ces notes il est nécessaire de trouver la gamme du morceau.

Reconnaissance de la gamme/l’armature

Dans cette étude, on ne s’intéressera aux notes dans une octave. On introduit donc la fonction \(\psi\) : \[\psi: ]0,\infty[ \rightarrow [0,12[ : f \mapsto \psi(f) \mod 12\] De même, on définit la fonction \(\bar{\psi}\) telle que \(\bar{\psi}(f)=\left\lfloor\psi(f)\right\rceil\). On voit que \(\mathrm{Im}(\bar{\psi})=\mathbb{Z}/12\mathbb{Z}\)

Note C B E F G A B
\(\bar{\psi}(f)\) 0 1 2 3 4 5 6 7 8 9 10 11

En musique classique, ils existent 4 types de gammes, on ne s’intéressera qu’à un : la gamme majeure. Comme on l’a déjà dit, une gamme est caractérisée par sa première note et la suite des intervalles. Dans la gamme majeure, les intérvalles en fonction du ton sont : 1–1–½–1–1–1–½.

La gamme Do/C Majeur contient donc les notes {0, 2, 4, 5, 7, 9, 11}.

De même, la gamme Sol/G Majeur contient les notes {7, 9, 11, 0, 2, 4, 6}. Ces gammes diffèrent par une note, la note 5\(\equiv\)F est remplacée par la note 6 qui correspond à F# ou G\(\flat\). Dans le contexte du Sol Majeur, on sait que 6\(\equiv\)F# car la gamme contient déjà 7\(\equiv\)G.

On voit bien que l’identification de la gamme est nécessaire pour la distinction entre certaines notes.

Une gamme peut être alors identifié par son ensemble de notes qu’on notera \(G\) tel que \(G\subset\mathbb{Z}/12\mathbb{Z}, |G|=7\). On définit le vecteur \(g\in\left\{0,1\right\}^{12}\) associé à \(G\) tel que \[ g_i = \mathbb{1}_G(i) = \begin{cases} 1 & \text{si } i\in G\\ 0 &\text{sinon}\end{cases}\] On définit donc \(E\) l’ensemble de gammes majeures.

Soit \(F\) l’ensemble de fréquences fondamentales obtenues, soit \(S=\bar{\psi}(F)\subset\mathbb{Z}/12\mathbb{Z}\), soit \(p:{Z}/12\mathbb{Z}\rightarrow\mathbb{N}:n\mapsto\text{le nombre d'occurances de $n$ dans le morceau}\). On note \(p_{\max}=\max\limits_{n\in S} p(n)\). On définit le vecteur \(x\in\left[0,1\right]^{12}\) tel que \(x_i=\frac{p(i)}{p_{\max}}\).

La gamme du morceau est alors la solution du problème d’optimisation \[ \min\limits_{g\in E}\quad \lVert g-x \rVert \] En musique classique, \(\lvert E\rvert = 12\) donc le problème d’optimisation ne nécessite pas une résolution mathémtique avancée.